home *** CD-ROM | disk | FTP | other *** search
/ CD Ware Multimedia 1995 May / cd Ware (Juegos) Epimundo.iso / WIN / UT_SYSTM / INITYME.ZIP / INITYME.INC < prev    next >
Encoding:
Text File  |  1994-10-21  |  11.3 KB  |  668 lines

  1. Comment
  2. ==================================================================
  3.  
  4. This section contains the logic for processing IF statements. I'm
  5. writing an interpreter language in MarxMenu. You can add your own
  6. conditionals for IniTyme here.
  7.  
  8. ==================================================================
  9. EndComment
  10.  
  11. Var
  12.   SearchList
  13.   SearchListNot
  14.   HardwareList
  15.   HardwareRead
  16.   GroupsRead
  17.  
  18.  
  19. Procedure ReadGroupList
  20. var St
  21.    if GroupsRead then Return
  22.    if NovConnection > 0
  23.       NovReadGroups(NovLoginName,GroupList)
  24.       SortArray(GroupList)
  25.    else
  26.       St = %GROUPS%
  27.       if St = ''
  28.          St = %S_GROUPS%
  29.       endif
  30.       if St > ''
  31.          while St > ''
  32.             AppendArray(GroupList,UpperCase(NextWord(St)))
  33.          endwhile
  34.          SortArray(GroupList)
  35.       endif
  36.    endif
  37.    GroupsRead
  38. EndProc
  39.  
  40.  
  41. Procedure SetupHardwareList
  42. var C
  43.    if HardwareRead then Return
  44.    AppendArray(HardwareList,DisplayType)
  45.    if ColorScreen
  46.       AppendArray(HardwareList,'COLOR')
  47.    else
  48.       AppendArray(HardwareList,'MONO')
  49.    endif
  50.  
  51.    C = CpuClass
  52.    if C = 1
  53.       AppendArray(HardwareList,'8086')
  54.  
  55.    elseif C = 2
  56.       AppendArray(HardwareList,'80286')
  57.  
  58.    elseif C = 3
  59.       AppendArray(HardwareList,'80386')
  60.  
  61.    elseif C = 4
  62.       AppendArray(HardwareList,'80486')
  63.  
  64.    endif
  65.  
  66.    if EmsInstalled then AppendArray(HardwareList,'EMS')
  67.    if XmsInstalled then AppendArray(HardwareList,'XMS')
  68.    if Mouse then AppendArray(HardwareList,'MOUSE')
  69.    if McpClass > 0 then AppendArray(HardwareList,'MATH')
  70.    SortArray(HardwareList)
  71.    HardwareRead
  72. EndProc
  73.  
  74.  
  75. Procedure PushStack (V)
  76.    AppendArray(Stack,V)
  77. EndProc
  78.  
  79.  
  80. Procedure PopStack
  81. var X
  82.    if NumberOfElements(Stack) = 0
  83.       Error ('Stack Empty!',LoopIndex)
  84.    endif
  85.    X = Stack[NumberOfElements(Stack)]
  86.    delete(Stack,NumberOfElements(Stack),1)
  87.    Return X
  88. EndProc
  89.  
  90.  
  91. Procedure Nugget
  92. var Word P FirstChar
  93.    Trim(IfLine)
  94.    FirstChar = Left(IfLine,1)
  95.    Word = NextWord(IfLine)
  96.  
  97.    if FirstChar Within('0','9')
  98.       PushStack(Value(Word))
  99.  
  100.    elseif (FirstChar = '"') or (FirstChar = "'")
  101.       PushStack(Word)
  102.  
  103.    else
  104.       P = Hash('!' + Word)
  105.       if P <> Nil
  106.          Run P
  107.       else
  108.          Error ('Word "' + Word + '" not Recognized!',LoopIndex)
  109.       endif
  110.    endif
  111.  
  112. EndProc
  113.  
  114.  
  115. Procedure Interpret
  116.    while IfLine > ''
  117.       Nugget
  118.    endwhile
  119. EndProc
  120.  
  121.  
  122. Procedure ExecValueOf
  123. var V P St
  124.    V = UpperCase(NextWord(IfLine))
  125.    if Right(V,1) <> '=' then V = V + '='
  126.    P = FindLine(V)
  127.    if P = 0
  128.       PushStack('')
  129.    else
  130.       St = Orig[P]
  131.       delete(St,1,pos('=',St))
  132.       Trim(St)
  133.       PushStack(St)
  134.    endif
  135. EndProc
  136.  
  137.  
  138. Procedure MakeSearchList
  139. var P St St2
  140.    if IfLine StartsWith '='
  141.       delete(IfLine,1,1)
  142.       Trim(IfLine)
  143.    endif
  144.  
  145.    P = Pos(' ',IfLine)
  146.    if P = 0 then P = Length(IfLine) + 1
  147.  
  148.    St = left(IfLine,P-1)
  149.    delete(IfLine,1,P)
  150.  
  151.    dispose(SearchList)
  152.    dispose(SearchListNot)
  153.  
  154.    while St > ''
  155.       St2 = Uppercase(NextWord(St))
  156.       if St2 StartsWith '!'
  157.          delete(St2,1,1)
  158.          AppendArray(SearchListNot,St2)
  159.       else
  160.          AppendArray(SearchList,St2)
  161.       endif
  162.    endwhile
  163. EndProc
  164.  
  165.  
  166. Procedure ExecGroups
  167.    ReadGroupList
  168.    MakeSearchList
  169.  
  170.    Loop SearchListNot
  171.       if PosInSortedList(LoopVal,GroupList) > 0
  172.          PushStack False
  173.          Return
  174.       endif
  175.    EndLoop
  176.  
  177.    Loop SearchList
  178.       if PosInSortedList(LoopVal,GroupList) > 0
  179.          PushStack True
  180.          Return
  181.       endif
  182.    EndLoop
  183.  
  184.    PushStack False
  185. EndProc
  186.  
  187.  
  188. Procedure ExecHardware
  189.    SetupHardwareList
  190.    MakeSearchList
  191.  
  192.    Loop SearchListNot
  193.       if PosInSortedList(LoopVal,HardwareList) > 0
  194.          PushStack False
  195.          Return
  196.       endif
  197.    EndLoop
  198.  
  199.    Loop SearchList
  200.       if PosInSortedList(LoopVal,HardwareList) > 0
  201.          PushStack True
  202.          Return
  203.       endif
  204.    EndLoop
  205.  
  206.    PushStack False
  207. EndProc
  208.  
  209.  
  210. Procedure ExecStation
  211. var S
  212.    if NovConnection > 0
  213.       S = NovStationAddress
  214.    else
  215.       S = %STATION%
  216.       if S = ''
  217.          S = %S_STATION%
  218.       endif
  219.    endif
  220.    PushStack(S)
  221. EndProc
  222.  
  223.  
  224. Procedure ExecStations
  225. var S
  226.    if NovConnection > 0
  227.       S = NovStationAddress
  228.    else
  229.       S = %STATION%
  230.       if S = ''
  231.          S = %S_STATION%
  232.       endif
  233.    endif
  234.    MakeSearchList
  235.  
  236.    if S = ''
  237.       PushStack False
  238.       Return
  239.    endif
  240.  
  241.    Loop SearchListNot
  242.       if pos(LoopVal,S) > 0
  243.          PushStack False
  244.          Return
  245.       endif
  246.    EndLoop
  247.  
  248.    Loop SearchList
  249.       if pos(LoopVal,S) > 0
  250.          PushStack True
  251.          Return
  252.       endif
  253.    EndLoop
  254.  
  255.    PushStack False
  256. EndProc
  257.  
  258.  
  259. Procedure ExecNetwork
  260. var N
  261.    if NovConnection > 0
  262.       N = 'NOVELL'
  263.    else
  264.       N = %NETWORK%
  265.       if N = ''
  266.          N = %S_NETWORK%
  267.       endif
  268.    endif
  269.    MakeSearchList
  270.  
  271.    if N = ''
  272.       PushStack False
  273.       Return
  274.    endif
  275.  
  276.    Loop SearchListNot
  277.       if LoopVal = N
  278.          PushStack False
  279.          Return
  280.       endif
  281.    EndLoop
  282.  
  283.    Loop SearchList
  284.       if LoopVal = N
  285.          PushStack True
  286.          Return
  287.       endif
  288.    EndLoop
  289.  
  290.    PushStack False
  291. EndProc
  292.  
  293.  
  294. Procedure ExecUsers
  295. var U
  296.    if NovConnection > 0
  297.       U = NovLoginName
  298.    else
  299.       U = %USER%
  300.       if U = ''
  301.          U = %S_USER%
  302.       endif
  303.    endif
  304.    MakeSearchList
  305.  
  306.    if U = ''
  307.       PushStack False
  308.       Return
  309.    endif
  310.  
  311.    Loop SearchListNot
  312.       if LoopVal = U
  313.          PushStack False
  314.          Return
  315.       endif
  316.    EndLoop
  317.  
  318.    Loop SearchList
  319.       if LoopVal = U
  320.          PushStack True
  321.          Return
  322.       endif
  323.    EndLoop
  324.  
  325.    PushStack False
  326. EndProc
  327.  
  328.  
  329. ;- Not Supported
  330. Procedure ExecRev
  331.    IfLine = ''
  332.    dispose(Stack)
  333.    PushStack True
  334. EndProc
  335.  
  336.  
  337. Procedure ExecPlus
  338. var A B
  339.    Nugget
  340.    B = PopStack
  341.    A = PopStack
  342.    PushStack(A + B)
  343. EndProc
  344.  
  345.  
  346. Procedure ExecMinus
  347. var A B
  348.    Nugget
  349.    B = PopStack
  350.    A = PopStack
  351.    PushStack(A - B)
  352. EndProc
  353.  
  354.  
  355. Procedure ExecEqual
  356. var A B
  357.    Nugget
  358.    B = PopStack
  359.    A = PopStack
  360.    PushStack(A = B)
  361. EndProc
  362.  
  363.  
  364. Procedure ExecNotEqual
  365. var A B
  366.    Nugget
  367.    B = PopStack
  368.    A = PopStack
  369.    PushStack(A <> B)
  370. EndProc
  371.  
  372.  
  373. Procedure ExecGreater
  374. var A B
  375.    Nugget
  376.    B = PopStack
  377.    A = PopStack
  378.    PushStack(A > B)
  379. EndProc
  380.  
  381.  
  382. Procedure ExecLess
  383. var A B
  384.    Nugget
  385.    B = PopStack
  386.    A = PopStack
  387.    PushStack(A < B)
  388. EndProc
  389.  
  390.  
  391. Procedure ExecGreaterEqual
  392. var A B
  393.    Nugget
  394.    B = PopStack
  395.    A = PopStack
  396.    PushStack(A >= B)
  397. EndProc
  398.  
  399.  
  400. Procedure ExecLessEqual
  401. var A B
  402.    Nugget
  403.    B = PopStack
  404.    A = PopStack
  405.    PushStack(A <= B)
  406. EndProc
  407.  
  408.  
  409. Procedure ExecAnd
  410. var A B
  411.    Nugget
  412.    B = PopStack
  413.    A = PopStack
  414.    PushStack(A and B)
  415. EndProc
  416.  
  417.  
  418. Procedure ExecOr
  419. var A B
  420.    Nugget
  421.    B = PopStack
  422.    A = PopStack
  423.    PushStack(A or B)
  424. EndProc
  425.  
  426.  
  427. Procedure ExecNot
  428.    Nugget
  429.    PushStack(not PopStack)
  430. EndProc
  431.  
  432.  
  433. Procedure ExecUpperCase
  434.    Nugget
  435.    PushStack(UpperCase(PopStack))
  436. EndProc
  437.  
  438.  
  439. Procedure ExecLeftParen
  440. var OldParenLevel
  441.    OldParenLevel = ParenLevel
  442.    ParenLevel = ParenLevel + 1
  443.    repeat
  444.       Nugget
  445.    until ParenLevel = OldParenLevel
  446. EndProc
  447.  
  448.  
  449. Procedure ExecRightParen
  450.    ParenLevel = ParenLevel - 1
  451. EndProc
  452.  
  453.  
  454. Procedure ExecIf
  455. var B
  456.    Interpret
  457.  
  458.    ;- Multiple conditionals are ANDed
  459.  
  460.    B = PopStack
  461.    while NumberOfElements Stack > 0
  462.       B = B and PopStack
  463.    endwhile
  464.  
  465.    if not B
  466.       LoopIndex = GoToList[LoopIndex]
  467.    endif
  468. EndProc
  469.  
  470.  
  471. Procedure ExecGoTo
  472.    LoopIndex = GoToList[LoopIndex]
  473. EndProc
  474.  
  475.  
  476. Procedure ExecInGroup
  477. var Group
  478.    ReadGroupList
  479.    Group = UpperCase(NextWord(IfLine))
  480.    PushStack(PosInSortedList(Group,GroupList) > 0)
  481. EndProc
  482.  
  483.  
  484. Procedure ExecExistFile
  485.    PushStack(ExistFile(UpperCase(NextWord(IfLine))))
  486. EndProc
  487.  
  488.  
  489. Procedure ExecExistDir
  490.    PushStack(ExistDir(UpperCase(NextWord(IfLine))))
  491. EndProc
  492.  
  493.  
  494. Procedure ExecEnvVar
  495.    PushStack(ReadEnv(UpperCase(NextWord(IfLine))))
  496. EndProc
  497.  
  498.  
  499. Procedure ExecInMem
  500.    PushStack(InMem(UpperCase(NextWord(IfLine))))
  501. EndProc
  502.  
  503.  
  504. Procedure ExecVlmLoaded
  505.    PushStack(VlmLoaded)
  506. EndProc
  507.  
  508.  
  509. Procedure ExecCPU
  510.    PushStack(CPUClass)
  511. EndProc
  512.  
  513.  
  514. Procedure ExecMathChip
  515.    PushStack(McpClass > 0)
  516. EndProc
  517.  
  518.  
  519. Procedure ExecUserName
  520.    if NovConnection > 0
  521.       PushStack(NovLoginName)
  522.    else
  523.       if %USER% > ''
  524.          PushStack(%USER%)
  525.       else
  526.          PushStack(%S_USER%)
  527.       endif
  528.    endif
  529. EndProc
  530.  
  531.  
  532. Procedure ExecDisplay
  533. var Disp
  534.    Disp = DisplayType
  535.  
  536.    if Disp = 0
  537.       PushStack 'HERC'
  538.  
  539.    elseif Disp = 1
  540.       PushStack 'CGA'
  541.  
  542.    elseif Disp = 3
  543.       PushStack 'EGA'
  544.  
  545.    elseif Disp = 4
  546.       PushStack 'VGA'
  547.  
  548.    else
  549.       PushStack ''
  550.  
  551.    endif
  552. EndProc
  553.  
  554.  
  555. Procedure ExecDayOfWeek
  556. var D
  557.    D = DayOfWeek
  558.  
  559.    if D = 0
  560.       PushStack 'SUN'
  561.  
  562.    elseif D = 1
  563.       PushStack 'MON'
  564.  
  565.    elseif D = 2
  566.       PushStack 'TUE'
  567.  
  568.    elseif D = 3
  569.       PushStack 'WED'
  570.  
  571.    elseif D = 4
  572.       PushStack 'THU'
  573.  
  574.    elseif D = 5
  575.       PushStack 'FRI'
  576.  
  577.    elseif D = 6
  578.       PushStack 'SAT'
  579.  
  580.    endif
  581. EndProc
  582.  
  583.  
  584. Procedure ExecMonth
  585. var D
  586.    D = Month
  587.  
  588.    if D = 1
  589.       PushStack 'JAN'
  590.  
  591.    elseif D = 2
  592.       PushStack 'FEB'
  593.  
  594.    elseif D = 3
  595.       PushStack 'MAR'
  596.  
  597.    elseif D = 4
  598.       PushStack 'APR'
  599.  
  600.    elseif D = 5
  601.       PushStack 'MAY'
  602.  
  603.    elseif D = 6
  604.       PushStack 'JUN'
  605.  
  606.    elseif D = 7
  607.       PushStack 'JUL'
  608.  
  609.    elseif D = 8
  610.       PushStack 'AUG'
  611.  
  612.    elseif D = 9
  613.       PushStack 'SEP'
  614.  
  615.    elseif D = 10
  616.       PushStack 'OCT'
  617.  
  618.    elseif D = 11
  619.       PushStack 'NOV'
  620.  
  621.    elseif D = 12
  622.       PushStack 'DEC'
  623.  
  624.    endif
  625. EndProc
  626.  
  627.  
  628. Procedure SetupLibWords
  629.    Hash ('!(')           = Loc ExecLeftParen
  630.    Hash ('!)')           = Loc ExecRightParen
  631.    Hash ('!+')           = Loc ExecPlus
  632.    Hash ('!-')           = Loc ExecMinus
  633.    Hash ('!<')           = Loc ExecLess
  634.    Hash ('!<=')          = Loc ExecLessEqual
  635.    Hash ('!<>')          = Loc ExecNotEqual
  636.    Hash ('!=')           = Loc ExecEqual
  637.    Hash ('!>')           = Loc ExecGreater
  638.    Hash ('!>=')          = Loc ExecGreaterEqual
  639.    Hash ('!AND')         = Loc ExecAnd
  640.    Hash ('!CPU')         = Loc ExecCPU
  641.    Hash ('!DAYOFWEEK')   = Loc ExecDayOfWeek
  642.    Hash ('!DISPLAY')     = Loc ExecDisplay
  643.    Hash ('!ENVVAR')      = Loc ExecEnvVar
  644.    Hash ('!EXISTDIR')    = Loc ExecExistDir
  645.    Hash ('!EXISTFILE')   = Loc ExecExistFile
  646.    Hash ('!GOTO')        = Loc ExecGoto
  647.    Hash ('!GROUPS')      = Loc ExecGroups
  648.    Hash ('!HARDWARE')    = Loc ExecHardWare
  649.    Hash ('!IF')          = Loc ExecIf
  650.    Hash ('!INGROUP')     = Loc ExecInGroup
  651.    Hash ('!INMEM')       = Loc ExecInMem
  652.    Hash ('!MATHCHIP')    = Loc ExecMathChip
  653.    Hash ('!MONTH')       = Loc ExecMonth
  654.    Hash ('!NETWORK')     = Loc ExecNetwork
  655.    Hash ('!NOT')         = Loc ExecNot
  656.    Hash ('!OR')          = Loc ExecOr
  657.    Hash ('!READENV')     = Loc ExecEnvVar
  658.    Hash ('!REV')         = Loc ExecRev
  659.    Hash ('!STATION')     = Loc ExecStation
  660.    Hash ('!STATIONS')    = Loc ExecStations
  661.    Hash ('!UPPERCASE')   = Loc ExecUpperCase
  662.    Hash ('!USERNAME')    = Loc ExecUserName
  663.    Hash ('!USERS')       = Loc ExecUsers
  664.    Hash ('!VALUEOF')     = Loc ExecValueOf
  665.    Hash ('!VLMLOADED')   = Loc ExecVlmLoaded
  666. EndProc
  667.  
  668.